/*
 *英才会硕信息科技有限公司拥有本软件的版权，拥有本软件版权2025   并保留所有权利。
 *Copyright 2021,YCHS Information&Science Technology Co.,Ltd,
 *All rights reserved.
 */
package com.ychs.lawyerback01.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.security.Key;
import java.util.Date;
import java.util.Map;

/**
 * @author xuehongjin
 * @version 1.0
 * @date 2025/8/7
 */
@Component
public class JwtUtils {

    @Value("${jwt.secret}")
    private String secret;

    @Value("${jwt.expire}")
    private Long expire; // 修改为Long类型

    private Key key;

    @PostConstruct
    public void init() {
        // 生成HMAC-SHA512签名密钥
        key = Keys.hmacShaKeyFor(secret.getBytes());
    }

    // 生成jwt
    public String generateToken(Long userId, Map<String, Object> claims) {
        return Jwts.builder()
                // 设置自定义的负载
                .setClaims(claims)
                // 设置主体（subject）为用户ID
                .setSubject(userId.toString())
                .setIssuedAt(new Date(System.currentTimeMillis())) // 签发时间
                .setExpiration(new Date(System.currentTimeMillis() + expire)) // 过期时间
                .signWith(key, SignatureAlgorithm.HS512) // 使用HS512算法和密钥key进行签名
                // 压缩并生成最终令牌
                .compact();
    }

    // 验证JWT是否过期
    public boolean validateToken(String token) {
        try {
            Claims claims = Jwts.parserBuilder()
                    .setSigningKey(key)
                    .build()
                    .parseClaimsJws(token)
                    .getBody();
            Date expirationDate = claims.getExpiration();
            return !expirationDate.before(new Date());
        } catch (JwtException | IllegalArgumentException e) {
            return false;
        }
    }

    // 从JWT中提取用户的id
    public String extractId(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(key)
                .build()
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }

    /**
     * 从令牌中提取所有负载信息
     * @param token 令牌
     * @return 包含所有负载的 Claims 对象
     */
    public Claims extractAllClaims(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(key)
                .build()
                .parseClaimsJws(token)
                .getBody();
    }

    /**
     * 从token中获取指定claim的值
     */
    public <T> T getClaimFromToken(String token, String claimName, Class<T> clazz) {
        Claims claims = extractAllClaims(token);
        return claims.get(claimName, clazz);
    }

}